/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat.primitives;

import java.io.IOException;
import java.io.Writer;

import pittypat.Json;

/**
 * 实现了 IJson 的字节数组。
 */
public final class Binary implements IPrimitive {
	// 表示一个长度为 0 的字节数组。
	private static final byte[] EMPTY = new byte[0];
	
	/**
	 * 将指定的字符串值解析为 byte[] 值。
	 * 
	 * @param s
	 *            要解析的字符串。
	 * @return 解析后的 byte[]。
	 */
	public static byte[] parse(java.lang.String s) {
		if (s == null || s.length() == 0) {
			return null;
		}

		s = s.trim();
		if (s.length() == 0) {
			return null;
		}

		if (s.equalsIgnoreCase("empty")) {
			return EMPTY;
		}
		
		if (s.startsWith("0x") || s.startsWith("0X")) {
			// 十六进制
			if ((s.length() % 2) != 0) {
				// 长度必须是 2 的整数倍
				return null;
			}
			
			if (s.length() == 2) {
				return EMPTY;
			}
			
			byte[] bytes = new byte[(s.length() - 2) / 2];
			for (int i = 2, n = 0; i < s.length(); i+=2, ++n) {		
				try {
					bytes[n] = (byte)java.lang.Integer.parseInt(s.substring(i, i + 2), 16);
				} catch (NumberFormatException e) {
					return null;
				}
			}
			
			return bytes;
		} else {
			// 看作 BASE64
			try {
				return java.util.Base64.getDecoder().decode(s);
			} catch (Exception e) {
				return null;
			}
		}
	}

	private byte[] value;

	/**
	 * 使用指定的值初始化 Binary 类的新实例。
	 * 
	 * @param value
	 *            值。
	 */
	public Binary(byte[] value) {
		this.value = value;
	}

	/**
	 * 获取基础类型的值。
	 * 
	 * @return 基础类型的值。
	 */
	public byte[] getValue() {
		return this.value;
	}
	
	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 *            目标文本流。
	 * @throws IOException
	 * @see pittypat.IJson#write(java.io.Writer)
	 */
	@Override
	public void write(Writer writer) throws IOException {
		Json.write(writer, value);
	}
}
